import myEnum from './myEnum.js'
import mySqlite from './mySqlite.js'
import store from './store/index.js'
// const chatUrl = "ws://172.25.229.167:2828/chat-netty"
// const chatUrl = "ws://172.25.152.30:2828/chat-netty"
const chatUrl = "ws://172.25.152.30:2828/chat-netty"
let isconnect = false

// 构造方法  聊天消息对象
/**
 * @param {Object} content
 * @param {Object} type  this.$myEnum.type.IMAGE / this.$myEnum.type.TEXT
 * @param {Object} time
 */
function Msg(content, type, time) {
	var thisMsg = {
		content: content, //动作类型
		type: type, //聊天消息类型
		time: (time == null ? Date.parse(new Date()) : time), //时间戳
		isMe: true, //是否本人
	}
	return thisMsg;
}
// 构造方法  websocket发送的消息对象
function MsgContent(action, senderId, receiverId, msg, extend) {
	var thisMsgContent = {
		action: action, //动作类型
		senderId: senderId, //发送者id，在最上面已经获取了当前登录用户，nowUser
		receiverId: receiverId, //接收者id
		msg: msg, //聊天消息内容
		extend: extend, //扩展字段
	}
	return thisMsgContent;
}

/************************************** 方法 **************************************/
function connectSocket(msgContent) {
	console.log("开始连接")
	uni.connectSocket({
		url: chatUrl,
		complete(q) {
			uni.onSocketOpen(function(res) {
				console.log('WebSocket连接已打开！');
				//发送上线消息给netty服务  
				sendSocketMessage(msgContent)
				//开始监听服务器消息
				onSocketMessage()
				isconnect = true;
			});
			uni.onSocketError(function(res) {
				console.log('WebSocket连接打开失败，请检查！');
			});
		}
	});
}

//下面的方法，如果action是发送消息，则需要保存至sqlite，消息历史记录中
//发送一条消息给服务器
function sendSocketMessage(msgContent) {
	console.log(msgContent)
	uni.sendSocketMessage({
		data: JSON.stringify(msgContent),
		complete(q) {
			//发送成功后，服务器需要返回可靠字段
			//服务器把未读消息发送过来，然后存入缓存中。
			console.log(q)
			// if(q.action == this.$WebsocketEnum.action.CHAT){
			// 	//存储到sqlite中。
			// 	//这个方法结束之后，聊天界面需要刷新
			// }
		}
	});
}

//下面的方法需要调用缓存的方法！！！！！

// 监听服务器发送的消息
function onSocketMessage() {
	console.log("开始监听服务器发送的消息")
	uni.onSocketMessage(function(res) {
		console.log(res.data)
		res = JSON.parse(res.data)
		var action = res.action
		console.log(res)
		console.log(res.action)
		switch (action) {
			case myEnum.action.CONNECT:
				//第一次(或重连)初始化连接

				break;
			case myEnum.action.CHAT:
				0
				//聊天消息，新的消息存到数据库中，并甩到缓存中更新当前最后一条字段。
				var senderId = res.senderId
				var tableName = "m" + res.senderId
				mySqlite.insertMsg(senderId, res.msg, res => {
					console.log("存入数据库成功 ", res)
				});
				store.resetlatelyMsg({
					userId: senderId,
					msg: msg
				})
				break;
				//推送，则本人为接收者
			case myEnum.action.SIGNED:
				//如果是聊天消息确认存储或发送，则修改本地，通过时间戳查找消息并修改
				//消息签收，用户登录，很多消息发过来，新的消息追加到缓存中
				if (res.msg.type == 3) {
					// TODO sqlite数据库没有已读字段，所以这个先不写。
					var time = res.msg.content
					//去数据库中找到，并修改
					//表为：receiverId
					var tableName = "m" + res.receiverId
					console.log(time, tableName)
				}
				break;
			case myEnum.action.KEEPALIVE:
				//客户端保持心跳，发送一个pong回去

				break;
			case myEnum.action.PULL_FRIEND:
				//加好友，放入好友申请缓存里面

				break;
		}
	});
}

export default {
	Msg, //聊天消息对象
	MsgContent, //websocket发送的消息对象




	connectSocket, //连接socket
	sendSocketMessage, //发送一条消息
	onSocketMessage, //监听服务器发送的消息
}
